<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /*promise实例是一个回调函数，这个回调函数里有两个参数分别是resolve和reject，
        分别代表着执行成功与失败的函数,函数调用的参数是该promise实例对象的值,promise实例有三个属性
        分别是 constructor promiseState promiseResult
            -所有的原型对象都有constructor的属性
            -promiseState 是表示promise实例对象的属性
            -promiseResult 是表示成功或失败的值
        Promise原型的方法有三个 then catch finally
            -then 的返回值默认为状态默认为成功，值为Undefined，return什么值就是什么，如果返回
            一个promise实例则会通过返回的promise实例还定义状态与值
            -catch 方法与then方法的第二个参数一样，默认为成功，then方法有两个参数
            -finally 方法不接受参数，默认有穿透属性，promise实例怎么来，怎么走，无论成功失败都会执行
            它的回调函数，只有返回一个失败状态的promise实例时才会有不一样的情况，会返回一个错误信息，
            如果语法写错，也同样会出错，其他时候都会无视                  
        */
        const p1 = new Promise((resolve, reject) => {
            try {
                throw new Error(alert('我写了个错误'))
                setTimeout(() => {
                    
                    console.log('异步执行成功');
                    resolve('完成')
                }, 2000);
            } catch (e) {
                console.log('失败了');
                reject('失败')
            }

        })
        let p2=p1.then((value)=>{
            return new Promise((resolve, reject) => {
               resolve(document.write('成功'))
            })
        },(reason)=>{
            console.log(document.write('失败'));
        })

        p2.catch((reason)=>{
            console.log('我失败了');
        })
        p2.finally(()=>{
            return new Promise((resolve,reject)=>{
                // throw new Error('我写了个错误')
               return '1'
           
            })
        })
        console.log('p2',p2);
    </script>
</body>

</html>